﻿using Nemerle.Collections;
using Nemerle.Text;
using Nemerle.Utility;

using System;
using System.Collections.Generic;
using System.Linq;
using Nemerle2.Compiler;
using MsCci=Microsoft.Cci;
using Nemerle;
using Nemerle.Assertions;

namespace MetadataReader.CCI
{
  // TODO: _Eter_: в первой версии Nemerle нужно исправить атрибут TypeAliasAttribute,
  // чтобы он содержал ссылку на тип, на которую ссылается алиас
  // Наверное, лучше всего сделать новый атрибут TypeAlias2Attribute, оставив совместимость
  // со старой версией (компилятор должен загружать и новый и старый атрибут, а писать только новый)

  /// <summary>
  /// Description of CciAliasTypeInfo.
  /// </summary>
  internal class CciAliasTypeInfo : CciTypeInfo, IAliasTypeInfo
  {
    public this(provider : CciMetadataProvider, typeDef : MsCci.INamedTypeDefinition, assembly : CciReferencedAssembly)
    {
      base(provider, typeDef, assembly);
    }

    public override IsTypeAlias : bool { get { true } }

    /// <summary>
    /// Gets <c>NTypeInfo</c> object for which the type info is an alias
    /// </summary>
    public AliasedType : ValueOption[FixedType]
    {
      [Memoize]
      get
      {
        def parseAliasedType(aliasTypeAttribute : MsCci.ICustomAttribute) : FixedType
        {
          def argsCount = aliasTypeAttribute.Arguments.Count();
          if (argsCount != 1)
            throw ApplicationException($"Invalid arguments count in '$(Constants.TypeAliasAttributeFullName)' attribute");
          else
          {
            //TODO: _Eter_ : нужно разобрать закодированный тип
            def _arg = (aliasTypeAttribute.Arguments.First() :> MsCci.IMetadataConstant).Value;
            null
          }
        }

        def typeAliasAttr = Definition.Attributes.FindAttribute(Constants.TypeAliasAttributeFullName).SingleOrDefault();

        if(typeAliasAttr == null || !IsInterface)
          ValueOption.None()
        else
          ValueOption.Some(parseAliasedType(typeAliasAttr))
      }
    }
  }
}
